package structure;

import java.util.Arrays;

import exceptions.OperationMatriceException;
import exceptions.OperationMatriceException;

public class Matrice {
	private int lignes, colonnes;
	private double[][] matrice;
	
	public Matrice(int l, int k) {
		lignes= l; colonnes= k;
		matrice= new double[lignes][colonnes];
	}
	
	public Matrice (double [] [] seq) {
		lignes = seq.length;
		colonnes = seq[0].length;
		matrice = seq;
	}
	
	public double[][] getMatrice() {
		return matrice;
	}

	public void setMatrice(double[][] matrice) {
		this.matrice = matrice;
	}

	public int getLignes() {
		return lignes;
	}

	public void setLignes(int lignes) {
		this.lignes = lignes;
	}

	public int getColonnes() {
		return colonnes;
	}

	public void setColonnes(int colonnes) {
		this.colonnes = colonnes;
	}

	public Matrice produit(double d) throws OperationMatriceException{
		for (int i=0; i<lignes; i++) {
			for (int j=0; j<colonnes; j++) {
				matrice[i][j]=  matrice[i][j] * d;
			}
		}
		return this;
	}
	
	public Matrice produit(Matrice m) throws OperationMatriceException{
		if (colonnes!=m.getLignes()) throw new OperationMatriceException("Produit impossible, incompatible");
		Matrice produit= new Matrice (lignes, m.getColonnes());
		double d;
		for (int n=0; n<m.getColonnes(); n++) {
			d=0;
			for (int i=0; i<lignes; i++) {
				d=0;
				for (int j=0; j<colonnes; j++) {
					d+= matrice[i][j] * m.getMatrice()[j][n];
				}
				produit.getMatrice()[i][n]= d;
			}
		}
		return produit;
	}
	
	public static Matrice produit(Matrice m, Matrice n) throws OperationMatriceException {
		if (m.getColonnes()!=n.getLignes()) throw new OperationMatriceException("Produit impossible, incompatible");
		Matrice produit= new Matrice (m.getLignes(), n.getColonnes());
		double d;
		for (int h=0; h<n.getColonnes(); h++) {
			d=0;
			for (int i=0; i<m.getLignes(); i++) {
				d=0;
				for (int j=0; j<m.getColonnes(); j++) {
					d+= m.getMatrice()[i][j] * n.getMatrice()[j][h];
				}
				produit.getMatrice()[i][h]= d;
			}
		}
		return produit;
	}
	
	public static Matrice produit(Matrice m, double d) throws OperationMatriceException {
		Matrice produit = new Matrice (m.getLignes(), m.getColonnes());
		for (int i=0; i<m.getLignes(); i++) {
			for (int j=0; j<m.getColonnes(); j++) {
				produit.getMatrice()[i][j] =  m.getMatrice()[i][j] * d;
			}
		}
		return produit;
	}
	

	public Matrice somme(Matrice m) throws OperationMatriceException{
		if ((colonnes!=m.getColonnes())||(lignes!=m.getLignes())) throw new OperationMatriceException("Soustraction impossible");
		Matrice somme= new Matrice (lignes, colonnes);
		for (int i=0; i<lignes; i++) {
			for (int j=0; j<colonnes; j++) {
				somme.getMatrice()[i][j]= matrice[i][j] + m.getMatrice()[i][j];
			}
			
		}
		return somme;
	} 
	
	public Matrice soustraction(Matrice m) throws OperationMatriceException{
		if ((colonnes!=m.getColonnes())||(lignes!=m.getLignes())) throw new OperationMatriceException("Soustraction impossible");
		Matrice soustraction= new Matrice (lignes, colonnes);
		for (int i=0; i<lignes; i++) {
			for (int j=0; j<colonnes; j++) {
				soustraction.getMatrice()[i][j]= matrice[i][j] - m.getMatrice()[i][j];
			}
			
		}
		return soustraction;
	}
	
	public Matrice transpose() {
		Matrice transpose= new Matrice(colonnes, lignes);
		for (int i=0; i<lignes; i++) {
			for (int j=0; j<colonnes; j++) {
				transpose.getMatrice()[j][i]= matrice[i][j];
			}
		}
		return transpose;
	}
	@Override
	public String toString() {
		String s="";
		for (int i=0; i<lignes; i++) {
			for (int j=0; j<colonnes; j++) {
				s+= matrice[i][j] + " ";
			}
			s+= "\n";
		}
		return s;
	}
	
}
